SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[LIQRecesoFuncional]
-- <DESCRIPCION> Calcula el receso funcional para aquellos agentes con servicios suplentes que no tienen mas servicios activos durante las vacaciones.
-- <CONSIDERACIONES ESPECIALES> 
-- <TABLAS> tb_ColaDeMovimientos, tb_PlazasDeMovimiento, tb_SubServiciosAgentes, tb_ServiciosAgentes, tb_Plazas
-- <PROCEDIMIENTOS> paDiasTrabajados

	@CabeceraDeLiquidacion INT,
	@IdLiquidacionActual INT,
	@ConceptoATotalizar INT,
	@EsSuplente BIT 
 AS
SET NOCOUNT ON
SET DATEFORMAT DMY
DECLARE @MesSuplentes INT
DECLARE @AnioSuplentes INT
DECLARE @AgenteV INT 
DECLARE @ServicioV INT 
DECLARE @FechaAltaV DATETIME
DECLARE @FechaBajaV DATETIME
DECLARE @SituacionRevistaV INT
DECLARE @OrganizacionV INT 
DECLARE @PlazaV INT
DECLARE @OrganizacionALiquidar INT 
DECLARE @TotalVacacionesNoGozadas DECIMAL(18,4)
DECLARE @NroError INT
DECLARE @Afiliacion INT
DECLARE @Horas INT
DECLARE @SubOrganizacion INT
DECLARE @DiasALiquidar INT 
DECLARE @Hasta DATETIME
DECLARE @UltimoSueldo DECIMAL(18,4)
DECLARE @Anios INT 
DECLARE @DiasTrabajados INT
DECLARE @MinimoDeDias INT
DECLARE @DiasLaboralesNivelInicial INT
DECLARE @DiasLaboralesNivelEGB INT
DECLARE @DiasLaboralesNivelPolimodal INT
DECLARE @Agente INT
DECLARE @TotalRecesoFuncional DECIMAL(18,4)
DECLARE @DiasSinPagar INT
DECLARE @FechaDesde DATETIME
DECLARE @FechaHasta DATETIME
DECLARE @DiasTrabajadosPorServicio INT
DECLARE @DiasLaborales INT
DECLARE @Escalafon INT
DECLARE @FechaInicioPLectivo DATETIME
DECLARE @FechaFinPLectivo DATETIME 
DECLARE @TopeDiasAPagarDiciembre INT

SELECT @DiasTrabajados = 0, @DiasTrabajadosPorServicio = 0

PRINT 'SE EMPIEZA CON RECESO FUNCIONAL'

-- 432096 452515 . Tito o Elizabeth.

SELECT @MesSuplentes=MONTH(DesdeSuplente), @AnioSuplentes=YEAR(DesdeSuplente), @Hasta = HastaSuplente
	 FROM Tb_CabeceraDeLiquidacion
	 WHERE IdCabeceraDeLiquidacion = @CabeceraDeLiquidacion

-- Se busca la Fecha de Inicio y Fin del Periodo Lectivo
SELECT @FechaInicioPLectivo = CONVERT(DATETIME, dbo.fnObtenerValorDeParametro ('FechaInicioPeriodoLectivoLIQ',@Hasta ))
SELECT @FechaFinPLectivo = CONVERT(DATETIME, dbo.fnObtenerValorDeParametro ('FechaFinPeriodoLectivoLIQ',@Hasta))

SET @TopeDiasAPagarDiciembre = 0 

	-- No es FechaHasta = FechaFinPLectivo ya que la baja puede ser hasta el 31/12 
	--SELECT @FechaDesde = @FechaInicioPLectivo, @FechaHasta = @FechaFinPLectivo

IF @MesSuplentes = 12 
	SELECT @FechaDesde = @FechaInicioPLectivo, @FechaHasta = @Hasta, @TopeDiasAPagarDiciembre = DATEDIFF(DAY, DATEADD(DAY,1,@FechaFinPLectivo), @Hasta) 
ELSE
	SELECT @FechaDesde = @FechaInicioPLectivo, @FechaHasta = @Hasta  


-- Obtencion de parametros.
SELECT @MinimoDeDias = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('MinimoDiasTrabajadosParaRecesoFuncional', @Hasta))
SELECT @DiasLaboralesNivelInicial = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('DiasLaboralesNivelInicial', @Hasta))
SELECT @DiasLaboralesNivelEGB = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('DiasLabotalesNivelEGB', @Hasta))
SELECT @DiasLaboralesNivelPolimodal = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('DiasLaboralesNivelPolimodal', @Hasta))

SELECT @OrganizacionALiquidar=Organizacion FROM Tb_Liquidaciones WHERE IdLiquidacion=@IdLiquidacionActual 


-- Todos los agentes que han tenido servicios como suplentes comunes o funcionales en el ano correspondiente
-- que tuvieron servicios dentro de la organizacion que se esta liquidando
-- que no tienen otro servicio activo a la fecha
DECLARE Agentes CURSOR forward_only  FOR
SELECT DISTINCT S.Agente
	FROM tb_ServiciosAgentes S 
		INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
			WHERE S.UbicacionOrig = @OrganizacionALiquidar
		   	     AND S.SituacionRevista IN (3,4)
			    AND S.FechaBaja = SS.FechaBaja
			    AND S.FechaBaja BETWEEN @FechaDesde AND @FechaHasta
			    AND NOT EXISTS(SELECT TOP 1 S2.Agente FROM Tb_ServiciosAgentes S2 WHERE S2.Agente=S.Agente AND S2.FechaBaja IS NULL)	  

OPEN Agentes

FETCH NEXT FROM Agentes INTO @Agente

WHILE @@FETCH_STATUS = 0
BEGIN
	PRINT 'Liquidando Agente...' + CONVERT(VARCHAR, @Agente) + 'Fecha Desde ' + convert(varchar, @fechadesde) + 'Fecha Hasta ' + convert(varchar, @fechahasta)

	-- Llama al procedimiento que calcula el total de dias trabajados por el docente. Tiene en cuenta Solapamientos.
	EXEC paDiasTrabajados @Agente, @FechaDesde, @FechaHasta, 'S', @DiasTrabajados OUTPUT

	PRINT CONVERT(varchar, @DiasTrabajados)

	IF @DiasTrabajados > @MinimoDeDias
	BEGIN

		-- Todos los servicios del Agente dentro de la organizacion
		DECLARE ServiciosConVacaciones CURSOR FOR 
		SELECT S.Agente, S.IdServicioAgente, S.FechaAlta, S.FechaBaja, S.SituacionRevista, S.UbicacionOrig, SS.Plaza
			FROM Tb_ServiciosAgentes S 
				INNER JOIN Tb_Agentes Ag ON Ag.IdAgente = S.Agente
				INNER JOIN Tb_SubServiciosAgentes SS ON SS.ServicioAgente = S.IdServicioAgente
			WHERE S.UbicacionOrig=@OrganizacionALiquidar
	  	  	      AND S.SituacionRevista IN (3, 4) 
		  	      AND S.FechaBaja = SS.FechaBaja
			      AND S.FechaBaja  BETWEEN @FechaDesde AND @FechaHasta
			    -- OJO
			    -- Ver si debemos analizar si ya se pago para el servicio	
	  		    --AND NOT EXISTS(SELECT RL.Concepto FROM Tb_RegistrodeLiquidaciones RL INNER JOIN Tb_Liquidaciones Liq ON Liq.IdLiquidacion = RL.Liquidacion WHERE Liq.Tipo=4 AND RL.Servicio=S.IdServicioAgente AND RL.Concepto=@ConceptoATotalizar AND RL.Agente = @Agente AND Mes = @MesSuplentes AND Anio = @AnioSuplentes)
		  	      AND S.Agente = @Agente

		OPEN ServiciosConVacaciones
		FETCH NEXT FROM ServiciosConVacaciones INTO @AgenteV, @ServicioV, @FechaAltaV, @FechaBajaV, @SituacionRevistaV, @OrganizacionV, @PlazaV

   		WHILE @@FETCH_STATUS = 0
		BEGIN



			--- Si la Fecha de Alta del Servicio es menor a la Fecha de Inicio del Periodo Lectivo poner la Fecha de Inicio
			IF @FechaAltaV < @FechaDesde
				 SELECT @FechaAltaV= @FechaDesde

			-- Los dias trabajados en el servicio durante el año. ------------------------------------------------------------------------------------
			SELECT @DiasTrabajadosPorServicio = DATEDIFF(DAY, @FechaAltaV, @FechaBajaV) + 1

			----- Obtener el ultimo sueldo. -----------------------------------------------------------------------------------------------------------------------
			SELECT TOP 1 @UltimoSueldo= R.MontoHaberes - ISNULL(R2.MontoHaberes,0) 
				FROM Tb_RegistrodeLiquidaciones R
				INNER JOIN Tb_Liquidaciones L ON L.IdLiquidacion = R.Liquidacion
				LEFT OUTER JOIN Tb_RegistroDeLiquidaciones R2 ON R2.Liquidacion = R.Liquidacion AND R2.Concepto=32 AND R2.Servicio=R.Servicio
				WHERE R.Servicio=@ServicioV 
				AND R.Concepto=16 
				AND L.Tipo = 4
				ORDER BY L.Anio DESC, L.Mes DESC

			IF @UltimoSueldo IS NULL
				SELECT @UltimoSueldo=0

			-- Los dias del Nivel. ------------------------------------------------------------------------------------
			-- Se obtiene el escalafon para obtener el nivel al que pertenece el cargo. Si es nulo el cargo le pongo escalafon de Inicial paa beneficiar al Agente.
			SELECT @Escalafon = ISNULL(Escalafon, 16) FROM tb_ServiciosAgentes S INNER JOIN tb_CargosSalariales C ON  S.CargoSalarial = C.IdCargo WHERE IdServicioAgente = @ServicioV

			IF @Escalafon = 16
				SELECT @DiasLaborales = @DiasLaboralesNivelInicial
			IF @Escalafon IN (18, 20)
				SELECT @DiasLaborales = @DiasLaboralesNivelPolimodal
			IF @Escalafon IN (19, 9, 10)
				SELECT @DiasLaborales = @DiasLaboralesNivelEGB

			-- Si no esta en ninguno de los escalafones anteriores los ponemos en inicial para beneficiar al agente.
			IF @Escalafon NOT IN (16,18,20,19,9,10)
				SELECT @DiasLaborales = @DiasLaboralesNivelInicial


			print '----------------'
			print 'Ultimo sueldo: ' + convert(varchar, @ultimosueldo)
			print 'dias trabajados: ' + convert(varchar, @diastrabajados)
			print 'dias laborales: ' + convert(varchar, @diaslaborales)
			print '----------------'


			-- OJO no se para que se utiliza VER
			IF @DiasSinPagar IS NULL 
				SELECT @DiasSinPagar = 0

			-- OJO no se para que se utiliza VER
			SELECT @DiasALiquidar = Dias FROM tb_Meses WHERE IDMes = MONTH(@FechaBajaV)

			------- CALCULO
			SELECT @TotalRecesoFuncional =0.0
			-- Se calcula el total del concepto.
			SELECT @TotalRecesoFuncional = @UltimoSueldo * @DiasTrabajadosPorServicio / @DiasLaborales

			------ VER LA PROPORCION EN QUE SE DEBE PAGAR DICHO RECESO MAS QUE NADA EN DICIEMBRE
			
			DECLARE @DiferenciaDiasAPagar INT 
			DECLARE @DiasMesLiquidado INT

			SET @DiferenciaDiasAPagar = 0 
			SELECT @DiasMesLiquidado = Dias FROM tb_Meses WHERE IDMes = MONTH(@Hasta)
			  
			IF @FechaBajaV <=  @FechaFinPLectivo AND @MesSuplentes = 12  
			
				SET @DiferenciaDiasAPagar = @TopeDiasAPagarDiciembre

			ELSE 
				IF @FechaBajaV <=  @FechaFinPLectivo   -- Enero y Febrero

					SET @DiferenciaDiasAPagar = @DiasTrabajadosPorServicio

				ELSE
				      BEGIN
					SET @DiferenciaDiasAPagar = DATEDIFF(DAY, @FechaBajaV, @Hasta)

					IF @DiferenciaDiasAPagar <=  0

						SET @DiferenciaDiasAPagar = 0

					ELSE

						IF @DiferenciaDiasAPagar > @DiasMesLiquidado

							SET @DiferenciaDiasAPagar = @DiasTrabajadosPorServicio

				    END 							


			-- Ahora vemos el proporcional por si trabajo en el mes (en el caso de diciembre). Esto es  >>> G E N E R I C O <<< se supone que no se va a dar de alta
			-- a un docente suplente durante las vacaciones.
			--SELECT @TotalRecesoFuncional = (@DiasTrabajadosPorServicio * (@DiasTrabajados - @DiasSinPagar)) / @DiasTrabajados

			---- PROPORCIONAR RECESO FUNCIONAL

			SELECT @TotalRecesoFuncional = @TotalRecesoFuncional * @DiferenciaDiasAPagar / @DiasTrabajadosPorServicio


			PRINT 'EL TOTAL POR RECESO FUNCIONAL ES:'
			PRINT CONVERT(VARCHAR, @TotalRecesoFuncional)

			IF @TotalRecesoFuncional >0
			    BEGIN
	
				DECLARE @PorcentajeDeSubsidio DECIMAL (18,4)
				DECLARE @TotalDeSubsidio DECIMAL (18,4)
	
				SELECT @Afiliacion = IdAfiliacion FROM Tb_Afiliaciones WHERE idAgente = @AgenteV
				SELECT @Horas= Horas, @SubOrganizacion = SubOrganizacion, @PorcentajeDeSubsidio = PorcentajeSubsidio FROM Tb_Plazas WHERE idPlaza = @PlazaV
	
				SELECT @TotalDeSubsidio = (@TotalRecesoFuncional * @PorcentajeDeSubsidio / 100)
	
				----- Receso Funcional
				INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista, DiasLiquidados, SubOrganizacion)
					VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, @ConceptoATotalizar, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalRecesoFuncional, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiferenciaDiasAPagar, @SubOrganizacion)

				----- Sueldo Bruto
				IF NOT EXISTS(SELECT top 1 Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=20)
					INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
					VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalRecesoFuncional, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiferenciaDiasAPagar, @SubOrganizacion)
				ELSE
					UPDATE Tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @TotalRecesoFuncional WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=20		
	
				----- Porcentaje de Subsidios
				IF NOT EXISTS(SELECT top 1 Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=22)
					INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
					VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 22, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @PorcentajeDeSubsidio, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiferenciaDiasAPagar, @SubOrganizacion)
	
	
				----  Total de Subsidio
				IF NOT EXISTS(SELECT top 1 Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=24)
					INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
					VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 24, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalDeSubsidio, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiferenciaDiasAPagar, @SubOrganizacion)
				ELSE
					UPDATE Tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @TotalDeSubsidio WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=24
			
				SELECT @NroError = @@ERROR
			
				IF @NroError <> 0
					 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
					(@AgenteV, @ConceptoATotalizar, CONVERT(VARCHAR,@NroError), GETDATE(), @IdLiquidacionActual, @OrganizacionV, @ServicioV, @CabeceraDeLiquidacion, @NroError)

   			   END 
	
			FETCH NEXT FROM ServiciosConVacaciones INTO @AgenteV, @ServicioV, @FechaAltaV, @FechaBajaV, @SituacionRevistaV, @OrganizacionV, @PlazaV
		END

		CLOSE ServiciosConVacaciones
		DEALLOCATE ServiciosConVacaciones

	END

	FETCH NEXT FROM Agentes INTO @Agente

END
	
CLOSE Agentes
DEALLOCATE Agentes
GO
